package finalapp.exercise.activities;

import finalapp.exercise.db.LocationsDB.Places;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import finalapp.exercise.R;

/**
 * Esta es la clase que se encarga de mostrar una localizacion
 * y tambien abre la actividad de editar la localizacion si se
 * aprieta un boton
 * 
 * @author Alejandro Villamarin
 *
 */
public class MostrarLugarActivity extends Activity{

	/**
	 * TextView que usaremos para que el usuario introduzca el titulo
	 */
	private TextView mNameText;
	
	/**
	 * TextView que usaremos para que el usuario introduzca la descripcion
	 */
	private TextView mDescText;
	
	/**
	 * ImageView que usaremos para que el usuario pueda visualizar la imagen asociada
	 */
	private ImageView mPicture;
	  
	/**
	 * Id de la localizacion, pasado desde el mapa en el bundle
	 */
	private int mRowId;
	  
	/**
	 * Variable que usaremos para almacenar la latitud pasada
	 */
	private double latitud;

	/**
	 * Variable que usaremos para almacenar la longitud pasada
	 */
	private double longitud;
	
	/**
	 * Variable que usaremos para almacenar la uri de la imagen pasada
	 */
	private String uriImagen;
	
	/**
	 * Variable que usaremos para almacenar el nombre de la localizacion pasada
	 */
	private String nombre;

	/**
	 * Variable que usaremos para almacenar la descripcion pasada
	 */
	private String desc;
	 
	/**
	  * Boton que usaremos para llamar a la activity EditarLugarActivity
	  */
	private Button botonEditar;

	/**
	 * Metodo que se llama cuando se crea la Activity
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
	        
		super.onCreate(savedInstanceState);
		
	    //asignamos el layout y el titulo    
		setContentView(R.layout.location_detail);
	    setTitle(R.string.titulo_localizacion);
	    
		//obtenemos los Views del layout
        mNameText = (TextView) findViewById(R.id.locationDetailNameDesc);
        mDescText = (TextView) findViewById(R.id.locationDetailDesc);
        mPicture = (ImageView) findViewById(R.id.locationDetailPic);
        botonEditar = (Button) findViewById(R.id.botonDetailEditar);
        
	    //Indicamos a la imagen que se ajuste a las dimensiones del drawable
	    mPicture.setAdjustViewBounds(true);
	    //establecemos altura y anchura maxima
	    mPicture.setMaxHeight(300);
	    mPicture.setMaxWidth(300);
        
        //obtenemos los datos pasados a traves del bundle
	    Bundle extras = getIntent().getExtras();
	    
	    //obtenemos la id de la localizacion
	    mRowId = extras.getInt(Places._ID);
	    //obtenemos el nombre de la localizacion
	    nombre = extras.getString(Places.NAME);
	    //obtenemos latitud y longitud
	    latitud = extras.getDouble(Places.LATITUDE);
	    longitud = extras.getDouble(Places.LONGITUDE);
	    
  	  	//obtenemos la uri de la imagen a cargar y la descripcion
  	  	if (!obtenerCampos(mRowId)){
  	  		desc = "Sin definir";
  	  		uriImagen = "";
  	  	}
	    
	    //Ponemos en los campos EditText los datos pasados como parametros
  	  	mNameText.setText(nombre);
  	  	mDescText.setText(desc);
	    
  	  	//si la hemos obtenido, la cargamos
  	  	if (uriImagen != null){
  	  		
  	  		if (!TextUtils.isEmpty(uriImagen)){
  	  			
	  	  		Uri uri = Uri.parse(uriImagen);
				String pathImagen = getPath(uri);
				Bitmap bm = BitmapFactory.decodeFile( pathImagen, null );
				mPicture.setImageBitmap(bm);
				//añadimos un listener a la imange
				mPicture.setOnClickListener(new View.OnClickListener() {
				    public void onClick(View v) {
				    	mostrarActivityFullScreen();
				    }
				});
  	  		}
  	  		
  	  	}
  	  	else{
  	  		mPicture.setImageResource(R.drawable.undefined);
  	  	}
	    	           
		//añadimos un listener al boton para eventos onclick
  	  	botonEditar.setOnClickListener(new View.OnClickListener() {
  	  		//al hacer click en el boton debera abrirse la activity EditarLugarActivity
	        public void onClick(View view) {
	        	Intent intent = new Intent();
	        	//llamamos a la activity que muestra la localizacion en detalle
				intent.setClass(getApplicationContext(), EditarLugarActivity.class);
				//vamos añadiendo lo que nos hace falta 
				intent.putExtra(Places._ID, mRowId);
				intent.putExtra(Places.NAME, nombre);
				intent.putExtra(Places.DESC, desc);
				intent.putExtra(Places.LATITUDE, latitud);
				intent.putExtra(Places.LONGITUDE, longitud);
				intent.putExtra(Places.PICTURE, uriImagen);
				//indicamos que venimos del mapa para editar una localizacion ya existente
				intent.putExtra("NUEVA", false);
				//llamamos a la activity
				startActivity(intent);
	        }

	    });
	}
	
	/**
	 * Metodo que llama al activity que muestra la imagen de la localizacion
	 */
	private void mostrarActivityFullScreen() {
	  	
		//Obtenemos el path fisico de la imagen y se lo pasamos a la activity en un Intent
		Uri uri = Uri.parse(uriImagen);
		String pathImagen = getPath(uri); 
    	//creamos un intent, le añadimos el path y llamamos al activity FullScreenPictureActivity
        Intent fullScreenIntent = new Intent(getApplicationContext(),FullScreenPictureActivity.class);
        fullScreenIntent.putExtra("PATH",pathImagen);
        this.startActivity(fullScreenIntent); 

	}

	     
	/**
	 * Este metodo busca en la base de datos los campos que no hemos podido pasar en el bundle
	 * como son la descripcion y la uri de la imagen
	 * 
	 * @param 	idLoc	El id de la localizacion	
	 * @return	TRUE si hemos conseguido obtener la descripcion y posiblemente el Uri de la imagen
	 */
	private boolean obtenerCampos(int idLoc) {
		    	
		//Obtenemos la localizacion que necesitamos de la base de datos
		String where = Places._ID + "=" + idLoc;
		final String[] columnas = new String[] { Places._ID, Places.NAME, Places.DESC, Places.LATITUDE, Places.LONGITUDE, Places.PICTURE};
		Uri uri = Uri.parse("content://finalapp.exercise.db.locationsprovider/location");
	    //obtenemos el cursor
		Cursor cursor = managedQuery(uri, columnas, where, null, null);
		   		
		//comprobamos que nos haya devuelto algo
		if (cursor.moveToFirst()) {
			//obtenemos la descripcion, que esta en el indice 2 
			desc = cursor.getString(2);
			uriImagen = cursor.getString(5);
			//comprobamos que la descripcion tiene algo, ya que es imposible que no lo tenga (la imagen sip)
			if (desc != null){
				if (!TextUtils.isEmpty(desc))
					return true;
				else
					return false;
			}
			else{
				return false;
			}
		}
		return false;
	}	    

	/**
	 * Metodo llamado al entrar en modo pause
	 */
	@Override
	protected void onPause() {
		super.onPause();
	}

	/**
	 * Metodo llamado al volver del modo pause
	 */
	@Override
	protected void onResume() {
		
		//debemos de recargar todos los datos si volvemos de la actividad que edita la localizacion
		recargarCampos(mRowId);
		super.onResume();        
	}

	/**
	 * Metodo que recarga la informacion de la localizacion de la base de datos y actualiza los TextView y la imagen
	 * 
	 * @param	idLoc	La clave de la localizacion de la que debemos mostrar los detalles
	 */
	private void recargarCampos(int idLoc) {
		
		//Obtenemos la localizacion que necesitamos de la base de datos
		String where = Places._ID + "=" + idLoc;
		final String[] columnas = new String[] { Places._ID, Places.NAME, Places.DESC, Places.LATITUDE, Places.LONGITUDE, Places.PICTURE};
		Uri uri = Uri.parse("content://finalapp.exercise.db.locationsprovider/location");
	    //obtenemos el cursor
		Cursor cursor = managedQuery(uri, columnas, where, null, null);
		   		
		//comprobamos que nos haya devuelto algo
		if (cursor.moveToFirst()) {
			//obtenemos la descripcion, que esta en el indice 2
			nombre = cursor.getString(1);
			desc = cursor.getString(2);
			latitud = cursor.getDouble(3);
			longitud = cursor.getDouble(4);
			uriImagen = cursor.getString(5);
			
			//recargamos los TextView y el ImageView
			 //Ponemos en los campos EditText los datos pasados como parametros
	  	  	mNameText.setText(nombre);
	  	  	mDescText.setText(desc);
		    
	  	  	//si la hemos obtenido, la cargamos
	  	  	if (uriImagen != null){
	  	  		
	  	  		if (!TextUtils.isEmpty(uriImagen)){

		  	  		Uri uriPic = Uri.parse(uriImagen);
		  	  		String pathImagen = getPath(uriPic);
		  	  		Bitmap bm = BitmapFactory.decodeFile( pathImagen, null );
		  	  		mPicture.setImageBitmap(bm);
					//añadimos un listener a la imange
					mPicture.setOnClickListener(new View.OnClickListener() {
					    public void onClick(View v) {
					    	mostrarActivityFullScreen();
					    }
					});
		  	  	

	  	  		}
	  	  		
	  	  	}
	  	  	else{
	  	  		mPicture.setImageResource(R.drawable.undefined);
	  	  	}
		
		}
		//si el cursor esta vacio, es muy posible que la activity de edicion haya eliminado la localizacion, por lo que cerraremos la activity
		else{
			this.finish();
		}
	}
	
	/**
	 * Metodo que obtiene el path de una Uri
	 * @param uri		URI de la que obtener el path
	 * @return		String que contiene el path asociado al URI
	 */
	public String getPath(Uri uri) {
		  
		//intentamos obtener el path que apunta a la imagen
		String[] projection = { MediaStore.Images.Media.DATA };
		Cursor cursor = managedQuery(uri, projection, null, null, null);
		//comprobamos que el cursor haya devuelto algo y solo 1 registro
		if (cursor != null && cursor.getCount() == 1 ) {
			cursor.moveToFirst();
		    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
		      cursor.moveToFirst();
		      return cursor.getString(column_index);
		       
		  }
		  else{
			  return null;
		  }  
	}
	
	
}
